package tankgame6;

import java.util.Vector;

@SuppressWarnings("all")
public class Enemy extends Tank implements Runnable {
    /**
     * 定义全部变量
     */
    Vector<Shot> shots = new Vector<>();//在哪里从集合里删除对象呢？？？？？？？？？？？？？？？？？？？？、
    Vector<Enemy> enemies = new Vector<>(); // 地方坦克集合
    boolean isLive = true;    // 该坦克是否存活

    public Enemy(int x, int y) {
        super(x, y);
    }
    public Enemy(int x, int y,int dir) {
        super(x, y,dir);
    }


    //判断敌人坦克是否重叠
    public boolean isTouchEnemy() {
        switch (this.getDirect()) {
            case 0://up  （我上，敌人上下，左右）
                for (int i = 0; i < enemies.size(); i++) {
                    Enemy enemy = enemies.get(i);
                    if (enemy != this) {  //不和自己比
                        //敌人： x范围：enemy.getX()------enemy.getX()+40
                        //      y范围：enemy.getY()------enemy.getY()+60

                        //(我上，敌上下情况)
                        if (enemy.getDirect() == 0 || enemy.getDirect() == 2) {
                            //我方坦克
                            //左上角：[this.getX(),this.getY()]
                            //1.this的左上的点在其他坦克的范围里
                            if (this.getX() >= enemy.getX()
                                    && this.getX() <= enemy.getX() + 40
                                    && this.getY() >= enemy.getY()
                                    && this.getY() <= enemy.getY() + 60) {
                                return true;
                            }

                            //右上角：【this.getX()+40,this.getY()】
                            //2.右上角左边在其他坦克的区域
                            if (this.getX() + 40 >= enemy.getX()
                                    && this.getX() + 40 <= enemy.getX() + 40
                                    && this.getY() >= enemy.getY()
                                    && this.getY() <= enemy.getY() + 60) {
                                return true;
                            }
                        }//if   (我上，敌方上下情况)

                        //(我上，敌方左右情况)
                        //敌人： x范围：enemy.getX()------enemy.getX()+60
                        //      y范围：enemy.getY()------enemy.getY()+40
                        else if (enemy.getDirect() == 1 || enemy.getDirect() == 3) {
                            if (this.getX() >= enemy.getX()
                                    && this.getX() <= enemy.getX() + 60
                                    && this.getY() >= enemy.getY()
                                    && this.getY() <= enemy.getY() + 40) {
                                return true;
                            }

                            //右上角：【this.getX()+40,this.getY()】
                            //2.右上角左边在其他坦克的区域
                            if (this.getX() + 40 >= enemy.getX()
                                    && this.getX() + 40 <= enemy.getX() + 60
                                    && this.getY() >= enemy.getY()
                                    && this.getY() <= enemy.getY() + 40) {
                                return true;
                            }
                        }
                    }
                }//for
                break;
            case 1://right  （我右，敌人上下，左右）
                for (int i = 0; i < enemies.size(); i++) {
                    Enemy enemy = enemies.get(i);
                    if (enemy != this) {
                        //敌人： x范围：enemy.getX()------enemy.getX()+40
                        //      y范围：enemy.getY()------enemy.getY()+60

                        //(我右，敌方上下情况)
                        if (enemy.getDirect() == 0 || enemy.getDirect() == 2) {
                            //我方坦克
                            //右上角：[this.getX()+60 ,this.getY()]
                            //1.this的右上点在其他坦克的范围里
                            if (this.getX() + 60 > enemy.getX()
                                    && this.getX() + 60 < enemy.getX() + 40
                                    && this.getY() > enemy.getY()
                                    && this.getY() < enemy.getY() + 60) {
                                return true;
                            }

                            //右下角：【this.getX()+60,this.getY()+40】
                            //2.右下角在其他坦克的区域
                            if (this.getX() + 60 > enemy.getX()
                                    && this.getX() + 60 < enemy.getX() + 40
                                    && this.getY() + 40 > enemy.getY()
                                    && this.getY() + 40 < enemy.getY() + 60) {
                                return true;
                            }
                        }//if   (我上，敌方上下情况)

                        //敌人： x范围：enemy.getX()------enemy.getX()+60
                        //      y范围：enemy.getY()------enemy.getY()+40
                        //1,我右上：【getX()+60 , getY()】
                        //(我右，敌方左右情况)
                        else if (enemy.getDirect() == 1 || enemy.getDirect() == 3) {
                            if (this.getX() + 60 >= enemy.getX()
                                    && this.getX() + 60 <= enemy.getX() + 60
                                    && this.getY() >= enemy.getY()
                                    && this.getY() <= enemy.getY() + 40) {
                                return true;
                            }

                            //右下角：【this.getX()+60,this.getY()+40】
                            //2.右下角左边在其他坦克的区域
                            if (this.getX() + 60 >= enemy.getX()
                                    && this.getX() + 60 <= enemy.getX() + 60
                                    && this.getY() + 40 >= enemy.getY()
                                    && this.getY() + 40 <= enemy.getY() + 40) {
                                return true;
                            }

                        }
                    }
                }//for
                break;
            case 2://down （我下，敌人上下，左右）
                for (int i = 0; i < enemies.size(); i++) {
                    Enemy enemy = enemies.get(i);
                    if (enemy != this) {
                        //敌人： x范围：enemy.getX()------enemy.getX()+40
                        //      y范围：enemy.getY()------enemy.getY()+60

                        //(我下，敌方上下情况)
                        if (enemy.getDirect() == 0 || enemy.getDirect() == 2) {
                            //我方坦克
                            //左下角：[this.getX() ,this.getY()+60]
                            //1.this的右上点在其他坦克的范围里
                            if (this.getX() > enemy.getX()
                                    && this.getX() < enemy.getX() + 40
                                    && this.getY() + 60 > enemy.getY()
                                    && this.getY() + 60 < enemy.getY() + 60) {
                                return true;
                            }

                            //右下角：【this.getX()+40,this.getY()+60】
                            //2.右下角在其他坦克的区域
                            if (this.getX() + 40 > enemy.getX()
                                    && this.getX() + 40 < enemy.getX() + 40
                                    && this.getY() + 60 > enemy.getY()
                                    && this.getY() + 60 < enemy.getY() + 60) {
                                return true;
                            }
                        }//if

                        //敌人： x范围：enemy.getX()------enemy.getX()+60
                        //      y范围：enemy.getY()------enemy.getY()+40
                        //左下角：[this.getX() ,this.getY()+60]
                        //(我下，敌方左右情况)
                        //1,左下点判断
                        else if (enemy.getDirect() == 1 || enemy.getDirect() == 3) {
                            if (this.getX() >= enemy.getX()
                                    && this.getX() <= enemy.getX() + 60
                                    && this.getY() + 60 >= enemy.getY()
                                    && this.getY() + 60 <= enemy.getY() + 40) {
                                return true;
                            }

                            //右下角：【this.getX()+40,this.getY()+60】
                            //2.右下点判断
                            if (this.getX() + 40 >= enemy.getX()
                                    && this.getX() + 40 <= enemy.getX() + 60
                                    && this.getY() + 60 >= enemy.getY()
                                    && this.getY() + 60 <= enemy.getY() + 40) {
                                return true;
                            }
                        }
                    }
                }//for
                break;
            case 3://left（我左，敌人上下，左右）
                for (int i = 0; i < enemies.size(); i++) {
                    Enemy enemy = enemies.get(i);
                    if (enemy != this) {
                        //敌人： x范围：enemy.getX()------enemy.getX()+40
                        //      y范围：enemy.getY()------enemy.getY()+60

                        //(我左，敌方上下情况)
                        if (enemy.getDirect() == 0 || enemy.getDirect() == 2) {
                            //我方坦克
                            //左上角：[this.getX() ,this.getY()]
                            //1.this的右上点在其他坦克的范围里
                            if (this.getX() > enemy.getX()
                                    && this.getX() < enemy.getX() + 40
                                    && this.getY() > enemy.getY()
                                    && this.getY() < enemy.getY() + 60) {
                                return true;
                            }

                            //左下角：【this.getX(),this.getY()+40】
                            //2.左下角在其他坦克的区域
                            if (this.getX() > enemy.getX()
                                    && this.getX() < enemy.getX() + 40
                                    && this.getY() + 40 > enemy.getY()
                                    && this.getY() + 40 < enemy.getY() + 60) {
                                return true;
                            }
                        }//if

                        //敌人： x范围：enemy.getX()------enemy.getX()+60
                        //      y范围：enemy.getY()------enemy.getY()+40
                        //左下角：[this.getX() ,this.getY()+60]
                        //(我左，敌方左右情况)
                        //左上角：[this.getX() ,this.getY()]
                        //1,左上点判断
                        else if (enemy.getDirect() == 1 || enemy.getDirect() == 3) {
                            if (this.getX() >= enemy.getX()
                                    && this.getX() <= enemy.getX() + 60
                                    && this.getY() >= enemy.getY()
                                    && this.getY() <= enemy.getY() + 40) {
                                return true;
                            }

                            //左下角：【this.getX(),this.getY()+40】
                            //2.左下点判断
                            if (this.getX() >= enemy.getX()
                                    && this.getX() <= enemy.getX() + 60
                                    && this.getY() + 40 >= enemy.getY()
                                    && this.getY() + 40 <= enemy.getY() + 40) {
                                return true;
                            }
                        }
                    }
                }//for
                break;
        }//switch
        return false;//没有在碰撞代码里返回
    }

    /**
     * 自动转向，且沿着这个方向一直走一段时间，必须是“缓慢”移动，坦克不能重叠，不能出画面
     * 自己发射子弹，（子弹自己走是子弹对象的事情），
     * 子弹没了还要从子弹集合里显示删除掉，
     * 线程终结,对象终结
     */
    @Override
    public void run() {
        while (true) {
            //不行的话直接终结就行（置成false操作在其他地方，比如击中敌人坦克方法里）
            if (!isLive) break;

            Shot s = null;
            if (this.isLive && this.shots.size() < 3) {
                switch (getDirect()) {
                    case 0:
                        s = new Shot(getX() + 20, getY(), 0);
                        break;
                    case 1:
                        s = new Shot(getX() + 60, getY() + 20, 1);
                        break;
                    case 2:
                        s = new Shot(getX() + 20, getY() + 60, 2);
                        break;
                    case 3:
                        s = new Shot(getX() + 20, getY() + 20, 3);
                        break;
                }
                shots.add(s);
                new Thread(s).start();  // 子弹马上”运动起来“
            }

            /**
             * 每隔一秒，执行变化方向函数，
             * 1s内，坦克总共移动20*2=40个像素
             *
             */
            switch (getDirect()) {
                case 0:
                    for (int i = 0; i < 20; i++) {  // 1s内变化20次，每次移动2个像素
                        if (getY() > 0 && !this.isTouchEnemy()) {   //加上功能：敌人坦克不能重叠
                            moveUp();
                        }
                        /**
                         * 没有try catch就是瞬移！
                         */
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                case 1:
                    for (int i = 0; i < 20; i++) {
                        if (getX() + 60 < 1000 && !this.isTouchEnemy())
                            moveRight();
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                case 2:
                    for (int i = 0; i < 20; i++) {
                        if (getY() + 60 < 650 && !this.isTouchEnemy())
                            moveDown();
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                case 3:
                    for (int i = 0; i < 20; i++) {
                        if (getX() > 0 && !this.isTouchEnemy())
                            moveLeft();
                        try {
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
            }
            //40像素以后，随机变化方向
            setDirect((int) (Math.random() * 4));
        }//while
    }//run

    public void setEnemies(Vector<Enemy> enemies) {
        this.enemies = enemies;
    }

}
